Vuetify is a popular UI framework for Vue apps.
In this article, we’ll look at how to work with the Vuetify framework.
Accordion
We can create an expansion panel with accordion style.
For example, we can write:
<template>
<v-container>
<v-row>
<v-col col="12">
<v-expansion-panels accordion>
<v-expansion-panel v-for="(item,i) in 5" :key="i">
<v-expansion-panel-header>Item</v-expansion-panel-header>
<v-expansion-panel-content>Lorem ipsum.</v-expansion-panel-content>
</v-expansion-panel>
</v-expansion-panels>
</v-col>
</v-row>
</v-container>
</template>
<script>
export default {
name: "HelloWorld",
data: () => ({}),
};
</script>
We have the accordion
prop to make it display like an accordion.
Focusable
The focusable
prop lets us make expansion panel headers focusable.
For instance, we can write:
<template>
<v-container>
<v-row>
<v-col col="12">
<v-expansion-panels focusable>
<v-expansion-panel v-for="(item,i) in 5" :key="i">
<v-expansion-panel-header>Item</v-expansion-panel-header>
<v-expansion-panel-content>Lorem ipsum.</v-expansion-panel-content>
</v-expansion-panel>
</v-expansion-panels>
</v-col>
</v-row>
</v-container>
</template>
<script>
export default {
name: "HelloWorld",
data: () => ({}),
};
</script>
With the focusable
prop, the selected expansion panel will have the heading highlighted.
External Control
The v-model
prop lets us control which panels are open.
For example, we can write:
<template>
<v-container>
<v-row>
<v-col col="12">
<div>
<div class="text-center d-flex pb-4">
<v-btn [@click](http://twitter.com/click "Twitter profile for @click")="all">all</v-btn>
<div>{{ panel }}</div>
<v-btn [@click](http://twitter.com/click "Twitter profile for @click")="none">none</v-btn>
</div>
<v-expansion-panels v-model="panel" multiple>
<v-expansion-panel v-for="(item,i) in items" :key="i">
<v-expansion-panel-header>Header {{ item }}</v-expansion-panel-header>
<v-expansion-panel-content>Lorem ipsum.</v-expansion-panel-content>
</v-expansion-panel>
</v-expansion-panels>
</div>
</v-col>
</v-row>
</v-container>
</template>
<script>
export default {
name: "HelloWorld",
data: () => ({
panel: [],
items: 5,
}),
methods: {
all() {
this.panel = [...Array(this.items).keys()].map((k, i) => i);
},
none() {
this.panel = [];
},
},
};
</script>
to create 5 expansion panels.
We have the all
method to open all panels.
This works because we have the multiple
prop.
The none
method closes all the panels by setting this.panel
to an empty array.
The v-model
on v-expansion-panels
controls the open state of the expansion panels.
Custom Icons
We can add custom icons for the top-right icon.
To do that, we write:
<template>
<v-container>
<v-row>
<v-col col="12">
<div>
<v-expansion-panels>
<v-expansion-panel>
<v-expansion-panel-header>
Item
<template v-slot:actions>
<v-icon color="primary">$expand</v-icon>
</template>
</v-expansion-panel-header>
<v-expansion-panel-content>Lorem ipsum.</v-expansion-panel-content>
</v-expansion-panel>
<v-expansion-panel>
<v-expansion-panel-header disable-icon-rotate>
Item
<template v-slot:actions>
<v-icon color="teal">mdi-check</v-icon>
</template>
</v-expansion-panel-header>
<v-expansion-panel-content>Lorem ipsum.</v-expansion-panel-content>
</v-expansion-panel>
<v-expansion-panel>
<v-expansion-panel-header disable-icon-rotate>
Item
<template v-slot:actions>
<v-icon color="error">mdi-alert-circle</v-icon>
</template>
</v-expansion-panel-header>
<v-expansion-panel-content>Lorem ipsum.</v-expansion-panel-content>
</v-expansion-panel>
</v-expansion-panels>
</div>
</v-col>
</v-row>
</v-container>
</template>
<script>
export default {
name: "HelloWorld",
data: () => ({}),
};
</script>
We populate the icon within the actions
slot.
Conclusion
We can make expansion panels show in an accordion style.
Also, we can add custom icons to expansion panels.